//--------------------------------------基础篇------------------------------------------------------
/*
    1. 类型注解（Type Annotations）
        作用 ：显式声明变量、函数参数/返回值的类型，避免运行时类型错误。
        场景 ：函数参数校验、对象属性约束、变量类型明确。
   ------------------------------------------------------------------------------------------ 
*/
// 变量类型注解
const username: string = "Trae";
const age: number = 25;

// 函数参数与返回值类型注解
function add(a: number, b: number): number {
  return a + b;
  // 返回两个数的和
  return a + b;
}

// 对象类型注解（简化版）
const user: { name: string; age: number } = {
  name: "Alice",
  age: 30
};

/*
    2. 接口（Interface）
        作用 ：定义对象的结构（属性、方法的类型），强制约束对象形状。 
        场景 ：组件 props 定义、数据模型规范、函数参数结构校验。
   -----------------------------------------------------------------------------------------
*/
// 定义用户接口
interface User {
  name: string;
  age: number;
  email?: string; // 可选属性（? 表示可选）
  sayHello: () => string; // 方法类型
}

// 使用接口约束对象
const user1: User = {
  name: "Bob",
  age: 28,
  sayHello() {
    return `Hello, ${this.name}`;
  }
  // email 可选，可省略
};

/*
    3. 类（Class）与面向对象
        作用 ：支持面向对象编程（封装、继承、多态），适合复杂业务逻辑的模块化设计。 
        场景 ：组件类、工具类、业务模型（如用户类、订单类）。
   -----------------------------------------------------------------------------------------
*/
// 基类（父类）
class Animal {
  protected name: string; // protected 表示子类可访问

  constructor(name: string) {
    this.name = name;
  }

  move(distance: number = 0): void {
    console.log(`${this.name} 移动了 ${distance}m`);
  }
}


// 子类（继承）
class Dog extends Animal {
  private breed: string; // private 仅当前类可访问

  constructor(name: string, breed: string) {
    super(name); // 调用父类构造函数
    this.breed = breed;
  }

  bark(): void {
    console.log(`${this.name}（品种：${this.breed}）：汪汪！`);
  }
}

const dog = new Dog("小白", "柯基");
dog.move(5); // 输出：小白 移动了 5m
dog.bark(); // 输出：小白（品种：柯基）：汪汪！


/*
    4. 泛型（Generics）
        作用 ：定义通用类型，让函数/类/接口能支持多种数据类型，同时保持类型安全。 
        场景 ：通用工具函数（如数组处理）、组件库（如通用列表组件）。
   -----------------------------------------------------------------------------------------
*/

// 泛型函数：反转数组
function reverseArray<T>(arr: T[]): T[] {
  return arr.reverse();
}

// 使用：自动推断类型为 number[]
const numArr = [1, 2, 3];
const reversedNum = reverseArray(numArr); // 类型：number[]

// 使用：显式指定类型为 string[]
const strArr = ["a", "b", "c"];
const reversedStr = reverseArray<string>(strArr); // 类型：string[]

// 泛型类：通用数据容器
class DataContainer<T> {
  private value: T;

  constructor(value: T) {
    this.value = value;
  }

  getValue(): T {
    return this.value;
  }
}

const container = new DataContainer<number>(100);
console.log(container.getValue()); // 输出：100（类型为 


/*
    5. 联合类型（Union）与交叉类型（Intersection）
        作用 ：
            - 联合类型（ | ）：变量可以是多种类型中的一种；
            - 交叉类型（ & ）：合并多个类型为一个类型（类似接口继承）。
        场景 ：参数支持多种类型（如字符串或数字ID）、对象属性合并。
   -----------------------------------------------------------------------------------------
*/
// 联合类型：ID可以是数字或字符串
type ID = number | string;

function getUserId(id: ID): void {
  console.log(`用户ID：${id}`);
}

getUserId(123); // 合法
getUserId("user_456"); // 合法


// 交叉类型：合并两个接口
interface A { x: number }
interface B { y: string }
type AB = A & B;  // 同时包含 x（number）和 y（string）属性
const obj: AB = { x: 10, y: "hello" };


/*
    6. 可选链（Optional Chaining）与 空值合并（Nullish Coalescing）
        作用 ：简化对可能为 null 或 undefined 值的访问逻辑，避免运行时错误。 
        场景 ：处理API返回的不确定数据（如可选字段）、嵌套对象访问。
   -----------------------------------------------------------------------------------------
*/
// 可选链（?.）：安全访问嵌套属性
interface UserInfo {
  profile?: {
    address?: {
      city?: string;
    };
  };
}

const user2: UserInfo = {};
const city = user2.profile?.address?.city; // 若任意环节为 undefined/null，返回 undefined

// 空值合并（??）：仅当左侧为 null/undefined 时取右侧值
const defaultCity = city ?? "未知城市"; // 若 city 是 undefined，返回 "未知城市"
